by 꽈배기
저번 글로벌 게임잼을 이후로 두번째로 대전 게임잼을 참가하게 되었다.
주제는 Gen AI 로 나온 결과물로 게임을 만드는것!
예전 Novel AI 때 잠깐이나마 diffusion 생성 모델을 다뤄본적이 있었는데, 그때와 비교하면 굉장히 발전이 된듯하다.
총 12명으로 3명의 팀으로 나뉘어 게임을 제작하였는데, 우리팀은 골동품 가게 컨셉을 살려 AI 이미지를 최대한 활용해보기로 했다.
물론 주제를 정하기 전에 가장 중요한것은 팀원들간의 합의가 아니겠는가?
서로 골동품이라는 컨셉을 가지로 어떻게 게임을 진행시킬지 아이디어를 의논했고 크게 두 가지 결론이 나왔다.
1번째 방향성은 기획자님이
2번째 방향성은 내가 제시하였다.
첫번째는 중고품 판매로 우산금지와 비슷하며. 두번째는 매니지먼트와 제작이 혼합된 게임으로 비슷한 예시인 잭스미스에 가깝다고 볼 수 있다.
전당포가 주를 이루는 게임 우산금지
NPC에게 제작한 무기를 건내주는 잭스미스
우리팀은 한 10분가량 서로 머리를 맞대고 어떤것이 더 좋을지 의논을 진행하였고 결과는 1번이 되었다.
나는 개인적으로 2번을 주장하였는데
가장 큰 이유는 우선순위 기준을 “재미”로 판단했기 때문이다.
(매니지먼트가 혼합되면 더 재밌을것이라 생각해서였다)
허나, 의논을 거친 결과 게임잼 시간 안에 매니지먼트의 재미요소 부분까지 구현이 힘들것이라 판단하여 1번째를 선택하였다.
결국 시간안에 구현하는것이 현 상황에 가장 중요하니 말이다.
그도 그럴것이 기획 개발 아트 가 각각 1:1:3으로 나 혼자 개발해야 할 상황이였기 때문…
(물론 별개로 기획자님의 아이디어도 꽤 흥미로웠다)
그렇게 기획이 잡혀가고 즉시 개발을 시작했다.
코드를 작성하기 전 우선 구현 대상의 구조부터 생각했다. 아이템 제작이 초점이기에 다루어야 할 데이터가 많은 것이다. 간단히 생각해보아도.
등이 필요하니 말이다.
그러니 요구사항을 정리해볼 필요가 있다.
sJson 파일로 데이터를 관리하자
개체에 접근하기 쉽도록 제너릭 싱글톤을 사용
Json 데이터 관리가 쉽도록 스크립트를 제어
아이템의 생성 로직을 분리하고 추상 팩토리를 사용
몇 가지 요구사항을 기반으로 작성을 시작했다.
게임잼 중후반에 갈수록 코드가 엉망으로 쌓여 도저히 손도 대기 힘든 코드가 되어버린 경험이 있었기에, 더욱 핵심 구조는 철저히 잡기로 하였다.
옆에선 아트님들이 단련된 근력으로 열심히 AI를 갈구시는 중이다.
중간에 맛있는 피자도 먹고 ㅎㅎ,,,
맛있게 잘 먹었습니다 PD님 ^- ^
참고로 이번 게임잼에서는 개발 장비가 모두 세팅되어 있었다.
개인 노트북을 하나 가져왔는데 역시 개발은 장비빨이 중요하다 세삼스레 느낀다.
다만 모듈 단위로 역할을 많이 분리해놔서 그런지 모니터 3개가 부족할 지경이였다.
데이터들의 관리는 DataManager를 싱글톤으로 만들어 관리하였다. 하지만 데이터 관리에 미흡했던 탓에 꽤나 곤혹을 치르게 되었다.
{
"code": 11,
"price": 150,
"honor": 2,
"grade": 2,
"name": "어둠의 창",
"Image": "DarknessSpear",
"description": "",
"recipe":
{
"recipeCode": 11,
"ingredientArray": [
{
"code": 0,
"needCount": 1
},
{
"code": 1,
"needCount": 2
},
{
"code": 3,
"needCount": 1
}]
}
},
무기 아이템의 데이터이다.
무엇보다 아이템 조합식과 그에 맞는 재료들을 매칭시켜 비교하는 과정에서 데이터 관리가 꽤 힘들었다. 마찬가지로 상인 / 재료 의 데이터도 모두 관리하기로 하였으니 가끔씩 생기는 배열의 인덱스 에러가 날 괴롭혔다..
<Manager.cs>
using UnityEngine;
public abstract class Manager<T> : MonoBehaviour where T : new()
{
private static T _instance;
public static T Instance
{
get
{
if (_instance == null)
{
_instance = FindObjectOfType(typeof(T)) as T;
Debug.Log("인스턴스 생성");
}
return _instance;
}
}
}
관리할 것 들이 많아지다보니 위의 요구사항대로 제너릭 타입의 싱글톤을 사용하였는데, 크게 Item / Data / Game / Resource 으로 제너릭을 나누었다.
DataManager에서 Json 데이터 파싱과 관리를 담당하고 Item에서는 생성된 아이템 (인벤토리 정보) 등을 저장하였다.
처음 구조를 설계할때는 데이터와 실제 아이템을 분리해야하는것이 옳다고 생각하였음에도, 막상 코드를 어느정도 작성하고 나니 무의식적으로 혼용해서 사용한것 같다.
옆에서 개발을 하던분꼐서 하신 말씀이 생각난다.
연관관계와 데이터를 어떻게 관리할지 잘 구상하는것이 중요하다.
이 말을 듣고 고개를 한 5번은 끄덕인 것 같다. 격투게임과 마찬가지로 맞고나서야 실감하게 되는 것 … 아닐까?
바빠보이는 척..
이것 저것 열심히 찾아다니는 모습
새벽까지 하다가 배가 고파 팀원들끼리 치킨을 먹었다.
역시 밤새며 먹는 치킨은 치트키가 아닐까 싶을 정도의 맛.
코딩 주머니를 담당할 국밥
마지막날에는 AI 멘토분이 오셔서 생성형 인공지능에 대해 설명해주셨다.
예상외의 부분이 네이버 TTS / 음성생성 기술이 전세계적인 수준이라고…
캐릭터마다 음성을 생성해서 적용시킬 수 있다면 인디게임의 저변도 강력해지지 않을까? 하는 생각이 들었다.
AI의 상용화가 이미 이루어지고 있고 특히 SD 모델의 성과가 계속 보이는걸로 보아 매우 기대가 된다.
이번 게임잼은 내게 꽤 큰 의미가 되지않았나 싶다. 노벨AI가 유출되고 난 후 잠깐 다뤄보았지만 그때 당시에는 모델의 부족함이 너무 많았다. (인체의 뒤틀림, 손가락의 기형 등)
하지만 현재 Gen2의 기술이라던지, MJ - gen2 runaway를 사용한 실시간 비디오 기술은 정말 놀라울 정도다.. 이번 기회를 통해 AI 리소스를 활용하는 방법을 고안해봐야겠다.
아래는 게임잼 기간동안 제작한 게임의 몇몇 스크린샷을 가져왔다. 현재 빌드에 약간 문제가 생겨 게임 플레이 영상은 추후에 추가하도록 해야겠다.